package front

import (
	"geekai/api/dto/request"
	"geekai/api/dto/response"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type ChatRoleHandler struct {
	handler.BaseHandler
}

func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler {
	return &ChatRoleHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}

// List godoc
// @Summary      获取应用列表
// @Description  获取应用列表
// @Tags         前台-用户应用
// @Accept       json
// @Produce      json
// @Param        tid   query     int  false  "应用分类Id"
// @Success      200  {object}  types.BizVo{data=[]response.ChatRole}
// @Router       /api/app/list [get]
// @Security ApiKeyAuth
func (h *ChatRoleHandler) List(c *gin.Context) {
	tid := h.GetInt(c, "tid", 0)
	var roles []model.ChatRole
	session := h.DB.Where("enable", true)
	if tid > 0 {
		session = session.Where("tid", tid)
	}
	err := session.Order("sort_num asc").Find(&roles).Error
	if err != nil {
		utils.ERROR(c, "操作数据库出现错误："+err.Error())
		return
	}
	var roleVos = make([]response.ChatRole, 0)
	for _, r := range roles {
		var v response.ChatRole
		err := utils.CopyObject(r, &v)
		if err == nil {
			v.Id = r.Id
			roleVos = append(roleVos, v)
		}
	}
	utils.SUCCESS(c, roleVos)
}

// ListByUser godoc
// @Summary      获取用户的应用角色列表
// @Description  获取用户的应用角色列表
// @Tags         前台-用户应用
// @Accept       json
// @Produce      json
// @Param        id   query     int  false  "应用Id"
// @Success      200  {object}  types.BizVo{data=[]response.ChatRole}
// @Router       /api/app/list/user [get]
// @Security ApiKeyAuth
func (h *ChatRoleHandler) ListByUser(c *gin.Context) {
	// 角色Id
	id := h.GetInt(c, "id", 0)
	userId := h.GetLoginUserId(c)
	var roles []model.ChatRole
	session := h.DB.Where("enable", true)
	// 查询用户的角色信息
	if userId > 0 {
		var user model.User
		// 查询用户信息
		h.DB.First(&user, userId)
		var roleKeys []string
		err := utils.JsonDecode(user.ChatRoles, &roleKeys)
		if err != nil {
			utils.ERROR(c, "用户的角色信息解析失败！")
			return
		}
		// 保证用户至少有一个角色可用
		if len(roleKeys) > 0 {
			session = session.Where("marker in ?", roleKeys)
		}
	}

	if id > 0 {
		session = session.Or("id", id)
	}
	// 查询角色信息
	res := session.Order("sort_num asc").Find(&roles)
	if res.Error != nil {
		utils.ERROR(c, "操作数据库出错："+res.Error.Error())
		return
	}

	var roleVos = make([]response.ChatRole, 0)
	for _, r := range roles {
		var v response.ChatRole
		err := utils.CopyObject(r, &v)
		if err == nil {
			v.Id = r.Id
			roleVos = append(roleVos, v)
		}
	}
	utils.SUCCESS(c, roleVos)
}

// UpdateRole godoc
// @Summary      更新用户聊天角色
// @Description  更新用户聊天角色
// @Tags         前台-用户应用
// @Accept       json
// @Produce      json
// @Param        req   body     request.UpdateUserRole  true  "更新用户角色信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/app/update [POST]
// @Security ApiKeyAuth
func (h *ChatRoleHandler) UpdateRole(c *gin.Context) {
	// 获取用户信息
	user, err := h.GetLoginUser(c)
	if err != nil {
		utils.NotAuth(c)
		return
	}
	var data request.UpdateUserRole
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err = h.DB.Model(&model.User{}).Where("id = ?", user.Id).UpdateColumn("chat_roles_json", utils.JsonEncode(data.Keys)).Error
	if err != nil {
		utils.ERROR(c, "操作数据库出现错误："+err.Error())
		return
	}
	utils.SUCCESS(c)
}
